package com.easystudy.media.util;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @文件名称: JsonUtil.java
 * @功能描述: json与对象互转工具
 * @版权信息: www.easystudy.com
 * @技术交流: 961179337(QQ群)
 * @编写作者: lixx2048@163.com
 * @联系方式: 941415509(QQ)
 * @开发日期: 2021年6月8日
 * @历史版本: V1.0 
 * @备注信息:
 */
public class JsonUtil {
	/**
	 * @功能描述: 对象转JSON
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月7日
	 * @备注信息:
	 */
	public static String toJson(Object original) {
		String result = "";
		ObjectMapper mapper = new ObjectMapper();
		try {
			mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));
			result = mapper.writeValueAsString(original);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return result;
	}
	
	/**
	 * @功能描述: JSON转对象
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2021年6月7日
	 * @备注信息:
	 */
	public static <T> T fromJson(String json , Class<T> c) {
		try {
			ObjectMapper mapper = new ObjectMapper();
			mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));
			return mapper.readValue(json, c);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * @功能描述: 获取泛型的Collection Type 
	 * @版权信息: www.easystudy.com
	 * @编写作者: lixx2048@163.com
	 * @开发日期: 2022年10月11日
	 * @备注信息: collectionClass 泛型的Collection 
	 * 			elementClasses 元素类    
	 * 			JavaType Java类型    
	 */
	public static JavaType getCollectionType(ObjectMapper mapper, Class<?> collectionClass, Class<?>... elementClasses) {   
		return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);   
	}
	
	public static <T> List<T> fromJsonList(String json , Class<T> c){
		try {
			ObjectMapper mapper = new ObjectMapper();
			mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));
			return mapper.readValue(json, getCollectionType(mapper, List.class, c));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}
